#include <stdio.h>
#include <stdlib.h>
#include "Lista.h"

    
Lista *Lista_construir()
    {
    Lista *lista = malloc(sizeof(Lista));
    lista->longitud = 0;
    lista->primer = NULL;
    return (lista);
    }

void Lista_destruir(Lista * lista, void(*destructor)(void*))
    {
    Nodo *p, *siguiente;

    for (p=lista->primer; p; p=siguiente)
        {
        siguiente = p->p_siguiente;
        (*destructor)(p->p_data);
        free(p);
        }
    free(lista);
    }
void Lista_listar(Lista *lista,void(*mostrador)(void*))
    {
    for (Nodo *p=lista->primer; p; p=p->p_siguiente)
        (*mostrador)(p->p_data);
    }

void Lista_agregar(Lista *lista, void *p_data)
    {
    Nodo *p;
    Nodo *p_nodo = malloc(sizeof(Nodo));

    p_nodo->p_data = p_data;
    p_nodo->p_siguiente = NULL;

    if (lista->primer == NULL)
        lista->primer = p_nodo;
    else
        {
        for (p= lista->primer; p->p_siguiente; p=p->p_siguiente);
        p->p_siguiente = p_nodo;
        }
    lista->longitud++;
    }
void *Lista_buscar(Lista *lista, int(*comprobador)(void*, void*),void *p_referencia)
    {
    int r;
    for (Nodo *p= lista->primer; p; p=p->p_siguiente)
        {
        r = (*comprobador)(p->p_data,p_referencia);
        if (r==0) return (p->p_data);
        }
    return (NULL);
    }
void *Lista_quitar(Lista *lista, void *p_data)
    {
    Nodo *p, *s;

    for (p= lista->primer; p->p_siguiente; p=p->p_siguiente)
        {
        if (p->p_siguiente->p_data == p_data) break;
        }

    if (p->p_siguiente)
        {
        s = p->p_siguiente;
        p->p_siguiente = s->p_siguiente;
        lista->longitud--;
        free(s);
        }
    else puts("NO LO ENCONTRE");
    }


